package com.ismarkendenis.superincreasingknapsack;

import java.math.BigInteger;
import java.util.Iterator;
import java.util.Vector;

public class HugeSuperIncreasingKnapsack {

	private BigInteger multiplier;
	private BigInteger modulo;
	private int[] bindecoder = { 0, 1, 2, 4, 8, 16, 32, 64, 128, 256};//128, 64, 32, 16, 8, 4, 2, 1, 0 
	private String EncryptedHugeKnapsackMessage = "";

	public HugeSuperIncreasingKnapsack() {
		multiplier = getMultiplier();
		modulo = getModulo();
		Vector<BigInteger> encryptedMessage = encrypt("Niet alleen de getallen uit de superincreasing knapsack bestaan uit minimaal 200 bits, de tekst bestaat zelf ook uit minimaal uit 200 tekens! "+ 
													"\nWat een geknip en geplak! Maar gelukkig bestaat er een BigInteger class in de math library van Java, dus heel moeilijk was het niet.", getPublicKey());
		Iterator<BigInteger> it = encryptedMessage.iterator();
		while(it.hasNext()){
			System.out.println(it.next().toString(16));
		}
		
		System.out.println(decrypt(getEncryptedMessage(), multiplier, modulo, getPrivateKey()));
	}
	
	private Vector<BigInteger> encrypt(String message, Vector<BigInteger> publicKey) {
		
		Vector<BigInteger> encryptedMessage = new Vector<BigInteger>(message.length());
		
		char[] characters = message.toCharArray();
		
		for (int i = 0; i < characters.length; i++) {
			
			char[] bits = new StringBuffer(Integer.toBinaryString((int) (characters[i]))).reverse().toString()
					.toCharArray();
			BigInteger encryptedChar = new BigInteger("0", 16);
			
			for (int j = 0; j < bits.length; j++) {
				if (bits[j] == 49) {
					encryptedChar = encryptedChar.add(publicKey.get(j));
				}
			}
			
			encryptedMessage.add(encryptedChar);
		}
		
		return encryptedMessage;
	}
	
	/**
	 * 
	 * @param encryptedMessage
	 * @param r
	 * @param q
	 * @param sis
	 * @return
	 */
	private String decrypt(Vector<BigInteger> encryptedMessage, BigInteger r, BigInteger q,
			Vector<BigInteger> sis) {
	
		String decryptedMessage = "";
		Iterator<BigInteger> it = encryptedMessage.iterator();
		
		while (it.hasNext()) {
			BigInteger invr = (it.next().multiply(r.modInverse(q))).mod(q);
			int[] code = { 0, 0, 0, 0, 0, 0, 0, 0 };
			int decrypted = 0;
			while (!(invr.compareTo(new BigInteger("0", 16)) == 0)) {
				Iterator<BigInteger> it2 = sis.iterator();

				boolean found = false;
				BigInteger previous = new BigInteger("0", 16);
				BigInteger current;
				int index = 0;

				
				while (it2.hasNext() && !found) {

					current = it2.next();
					if (current.compareTo(invr) == 1) {
						invr = invr.subtract(previous);
						found = true;
						decrypted += bindecoder[index];
					}
					index++;
					previous = current;
				}
				if (!found) {
					invr = invr.subtract(previous);
					decrypted += bindecoder[7];
				}
			}
			
			decryptedMessage += ((char) decrypted);
		}
		return decryptedMessage;
	}

	private Vector<BigInteger> getPublicKey() {
		Vector<BigInteger> publicKey = new Vector<BigInteger>();
		publicKey.add(new BigInteger(
				"328D7C79E4FDBE27F1D46591602C408BCF5BFB7DB39A515518A1", 16));
		publicKey.add(new BigInteger(
				"819639474E581D95DD469AA423F9B9FED9EB296BD733436A96FC", 16));
		publicKey.add(new BigInteger(
				"B9C44FFF07D92879ADD74236FCC71DFF4E151856A6ACC330E8BA", 16));
		publicKey.add(new BigInteger(
				"B5740651905C54E59176EA9ACD5B4529101786466EA26FA8A080", 16));
		publicKey.add(new BigInteger(
				"31B30E1AE9EDDD7476DE05E8887BE78968862B91C96853BE996A", 16));
		publicKey.add(new BigInteger(
				"2D0EEA17CB85D0543344578251358019E144313A21F30008512C", 16));
		publicKey.add(new BigInteger(
				"2AF23628723DBC79A2FB5F1E8E374A0DB73EC62E29B75476F924", 16));
		publicKey.add(new BigInteger(
				"3F08D48DC39DF0BCB017FD760F8BD80089FFF3964011C40675A2", 16));
		return publicKey;
	}

	private Vector<BigInteger> getPrivateKey() {
		Vector<BigInteger> privateKey = new Vector<BigInteger>();
		privateKey.add(new BigInteger(
				"F9CFEFE5E4F15F3C0C6151A0654C4281E61CBCB6C94EA851C9", 16));
		privateKey.add(new BigInteger(
				"01A3049CAAD6CBBB0B503B249D9A30E86E2351C294EE8DA620EE", 16));
		privateKey.add(new BigInteger(
				"039A82CA6C0BBF5831A0A1329DCD63B509C7ED034C913B5A8322", 16));
		privateKey.add(new BigInteger(
				"07168E4FD780F9A05E05B189B3C80C9D0E0E5B415D601C4F119A", 16));
		privateKey.add(new BigInteger(
				"0E41DE9C50EC4B29A65273E4D99F74E0D8AB2E13D3B6295D3CCC", 16));
		privateKey.add(new BigInteger(
				"1C1D9C0592BCC333AC4489C95DB67C0D89F375B5CB5F55B48BE0", 16));
		privateKey.add(new BigInteger(
				"385EDBA2475815EF3EC3AD9FCD57454DBC610F906480594178C8", 16));
		privateKey.add(new BigInteger(
				"70ED695B21FC6797CF7AA000FF9D0D698127650AE2441B76A218", 16));
		return privateKey;
	}

	private BigInteger getMultiplier() {
		return new BigInteger("0D19CC01EF6B6082EDF119437B", 16);
	}

	private BigInteger getModulo() {
		return new BigInteger(
				"E1C0B242BB64C30487F4A19C1039C25AE4F53DD01A4D467A0D0A", 16);
	}
	
	private Vector<BigInteger> getEncryptedMessage(){
		Vector<BigInteger> encryptedMessage = new Vector<BigInteger>();
		
		encryptedMessage.add(new BigInteger("E4B686277A16E4F350D2A1558AFE680D0553DE84D06417A7E1DE", 16));
		
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("01C0BE6DF40665DCBDBBDB41C8593DB0D8EB0BD2AC5AE85B511B36", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		
		encryptedMessage.add(new BigInteger("0143787E5A2F8A92BBFAF4FEC064AFCFB04F1E3B50BBBF6B6ECC74", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("01C198DC530175BD7136D1A17130EE09DB51E1A298451A58E79A6D", 16));
		encryptedMessage.add(new BigInteger("013DD7E41C5B0746001C38BCBEEC0EAC3BAA5047E39FE03CFD9357", 16));
		encryptedMessage.add(new BigInteger("0143787E5A2F8A92BBFAF4FEC064AFCFB04F1E3B50BBBF6B6ECC74", 16));
		encryptedMessage.add(new BigInteger("014002A30BB31D9FDB598B06CD0CF44FDC77F6792C6DE7157D0371", 16));
		encryptedMessage.add(new BigInteger("013DD7E41C5B0746001C38BCBEEC0EAC3BAA5047E39FE03CFD9357", 16));
		encryptedMessage.add(new BigInteger("01C5E9260078F291055331F90D6059E2B18FDF34A87D24AC6FE2A7", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("01C5E9260078F291055331F90D6059E2B18FDF34A87D24AC6FE2A7", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("010B4A67A2760987D82A64572D8BE26BAFDAF44C65EC45EBA87AB6", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("010B4A67A2760987D82A64572D8BE26BAFDAF44C65EC45EBA87AB6", 16));
		encryptedMessage.add(new BigInteger("0111C5703F459CB5478416F8D7DC33E826E6980FBEF25717B0330A", 16));
		encryptedMessage.add(new BigInteger("01F9C6F30ABAF6C8550762490409BB6DDBC60B91831493D8ADEC2B", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("0143787E5A2F8A92BBFAF4FEC064AFCFB04F1E3B50BBBF6B6ECC74", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("013DD7E41C5B0746001C38BCBEEC0EAC3BAA5047E39FE03CFD9357", 16));
		encryptedMessage.add(new BigInteger("017605FAD4148850E3ECC96451C4DC103C1E7A36CE6F59BCC3E515", 16));
		encryptedMessage.add(new BigInteger("89B42E5B27B16A424D1DBC8967E8B1B1010922FA1512A83DE3BA", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("010B4A67A2760987D82A64572D8BE26BAFDAF44C65EC45EBA87AB6", 16));
		encryptedMessage.add(new BigInteger("014002A30BB31D9FDB598B06CD0CF44FDC77F6792C6DE7157D0371", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("010C24D6017119688BA55AB6D66392C4B241CA1C51D677E93EF9ED", 16));
		encryptedMessage.add(new BigInteger("010B4A67A2760987D82A64572D8BE26BAFDAF44C65EC45EBA87AB6", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("8A8E9CBA22C14AF5C8141C323F990AB367DEF2E5FF44A5D462F1", 16));
		encryptedMessage.add(new BigInteger("013DD7E41C5B0746001C38BCBEEC0EAC3BAA5047E39FE03CFD9357", 16));
		encryptedMessage.add(new BigInteger("014002A30BB31D9FDB598B06CD0CF44FDC77F6792C6DE7157D0371", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("01C5E9260078F291055331F90D6059E2B18FDF34A87D24AC6FE2A7", 16));
		encryptedMessage.add(new BigInteger("01C198DC530175BD7136D1A17130EE09DB51E1A298451A58E79A6D", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("8A8E9CBA22C14AF5C8141C323F990AB367DEF2E5FF44A5D462F1", 16));
		encryptedMessage.add(new BigInteger("89B42E5B27B16A424D1DBC8967E8B1B1010922FA1512A83DE3BA", 16));
		encryptedMessage.add(new BigInteger("013DD7E41C5B0746001C38BCBEEC0EAC3BAA5047E39FE03CFD9357", 16));
		encryptedMessage.add(new BigInteger("8A8E9CBA22C14AF5C8141C323F990AB367DEF2E5FF44A5D462F1", 16));
		encryptedMessage.add(new BigInteger("010C24D6017119688BA55AB6D66392C4B241CA1C51D677E93EF9ED", 16));
		encryptedMessage.add(new BigInteger("01C198DC530175BD7136D1A17130EE09DB51E1A298451A58E79A6D", 16));
		encryptedMessage.add(new BigInteger("0111C5703F459CB5478416F8D7DC33E826E6980FBEF25717B0330A", 16));
		encryptedMessage.add(new BigInteger("014002A30BB31D9FDB598B06CD0CF44FDC77F6792C6DE7157D0371", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("017605FAD4148850E3ECC96451C4DC103C1E7A36CE6F59BCC3E515", 16));
		encryptedMessage.add(new BigInteger("014002A30BB31D9FDB598B06CD0CF44FDC77F6792C6DE7157D0371", 16));
		
		encryptedMessage.add(new BigInteger("0143787E5A2F8A92BBFAF4FEC064AFCFB04F1E3B50BBBF6B6ECC74", 16));
		encryptedMessage.add(new BigInteger("01C5E9260078F291055331F90D6059E2B18FDF34A87D24AC6FE2A7", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("0143787E5A2F8A92BBFAF4FEC064AFCFB04F1E3B50BBBF6B6ECC74", 16));
		encryptedMessage.add(new BigInteger("8A8E9CBA22C14AF5C8141C323F990AB367DEF2E5FF44A5D462F1", 16));
		encryptedMessage.add(new BigInteger("01C7397690D5F90A2D158DE372A98F2D4FF6AF960560F98758D38A", 16));
		encryptedMessage.add(new BigInteger("01C7397690D5F90A2D158DE372A98F2D4FF6AF960560F98758D38A", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("01C50EB7A17DE2B051D83B996488A989AF290964BC92F2AED96370", 16));
		encryptedMessage.add(new BigInteger("8A8E9CBA22C14AF5C8141C323F990AB367DEF2E5FF44A5D462F1", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("01370A3F98DEB4727B6EBD853EF154FF27EA02AFB245D5B313377C", 16));
		encryptedMessage.add(new BigInteger("01F9C6F30ABAF6C8550762490409BB6DDBC60B91831493D8ADEC2B", 16));
		
		encryptedMessage.add(new BigInteger("014002A30BB31D9FDB598B06CD0CF44FDC77F6792C6DE7157D0371", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("013DD7E41C5B0746001C38BCBEEC0EAC3BAA5047E39FE03CFD9357", 16));
		encryptedMessage.add(new BigInteger("0143787E5A2F8A92BBFAF4FEC064AFCFB04F1E3B50BBBF6B6ECC74", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("013DD7E41C5B0746001C38BCBEEC0EAC3BAA5047E39FE03CFD9357", 16));
		encryptedMessage.add(new BigInteger("E058317A03CBCB5E8768F80EFDAB21A223B58637C28E97318192", 16));
		encryptedMessage.add(new BigInteger("5EC1F832B573ADC8AA225D6AD9B167A349CA5CCBEB5B53C6EA96", 16));
		encryptedMessage.add(new BigInteger("5EC1F832B573ADC8AA225D6AD9B167A349CA5CCBEB5B53C6EA96", 16));
		encryptedMessage.add(new BigInteger("D99759878C1BAA63B386514503668426726E20D422DD97E9E14C", 16));
		encryptedMessage.add(new BigInteger("014002A30BB31D9FDB598B06CD0CF44FDC77F6792C6DE7157D0371", 16));
		encryptedMessage.add(new BigInteger("0143787E5A2F8A92BBFAF4FEC064AFCFB04F1E3B50BBBF6B6ECC74", 16));
		encryptedMessage.add(new BigInteger("013DD7E41C5B0746001C38BCBEEC0EAC3BAA5047E39FE03CFD9357", 16));
		encryptedMessage.add(new BigInteger("D99759878C1BAA63B386514503668426726E20D422DD97E9E14C", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("013DD7E41C5B0746001C38BCBEEC0EAC3BAA5047E39FE03CFD9357", 16));
		encryptedMessage.add(new BigInteger("0143787E5A2F8A92BBFAF4FEC064AFCFB04F1E3B50BBBF6B6ECC74", 16));
		encryptedMessage.add(new BigInteger("8A8E9CBA22C14AF5C8141C323F990AB367DEF2E5FF44A5D462F1", 16));
		encryptedMessage.add(new BigInteger("8A8E9CBA22C14AF5C8141C323F990AB367DEF2E5FF44A5D462F1", 16));
		encryptedMessage.add(new BigInteger("0143787E5A2F8A92BBFAF4FEC064AFCFB04F1E3B50BBBF6B6ECC74", 16));
		encryptedMessage.add(new BigInteger("021DDD79AFB2136B494FD91EF83F519D41195BF9430E75764C7162", 16));
		
		encryptedMessage.add(new BigInteger("E4B686277A16E4F350D2A1558AFE680D0553DE84D06417A7E1DE", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("01F9C6F30ABAF6C8550762490409BB6DDBC60B91831493D8ADEC2B", 16));
		encryptedMessage.add(new BigInteger("017605FAD4148850E3ECC96451C4DC103C1E7A36CE6F59BCC3E515", 16));
		encryptedMessage.add(new BigInteger("01C7397690D5F90A2D158DE372A98F2D4FF6AF960560F98758D38A", 16));
		encryptedMessage.add(new BigInteger("0143787E5A2F8A92BBFAF4FEC064AFCFB04F1E3B50BBBF6B6ECC74", 16));
		encryptedMessage.add(new BigInteger("014002A30BB31D9FDB598B06CD0CF44FDC77F6792C6DE7157D0371", 16));
		encryptedMessage.add(new BigInteger("89B42E5B27B16A424D1DBC8967E8B1B1010922FA1512A83DE3BA", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("010B4A67A2760987D82A64572D8BE26BAFDAF44C65EC45EBA87AB6", 16));
		encryptedMessage.add(new BigInteger("014002A30BB31D9FDB598B06CD0CF44FDC77F6792C6DE7157D0371", 16));
		encryptedMessage.add(new BigInteger("013DD7E41C5B0746001C38BCBEEC0EAC3BAA5047E39FE03CFD9357", 16));
		
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("01C5E9260078F291055331F90D6059E2B18FDF34A87D24AC6FE2A7", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("0143787E5A2F8A92BBFAF4FEC064AFCFB04F1E3B50BBBF6B6ECC74", 16));
		encryptedMessage.add(new BigInteger("8A8E9CBA22C14AF5C8141C323F990AB367DEF2E5FF44A5D462F1", 16));
		
		encryptedMessage.add(new BigInteger("01C7397690D5F90A2D158DE372A98F2D4FF6AF960560F98758D38A", 16));
		encryptedMessage.add(new BigInteger("01C50EB7A17DE2B051D83B996488A989AF290964BC92F2AED96370", 16));
		encryptedMessage.add(new BigInteger("8A8E9CBA22C14AF5C8141C323F990AB367DEF2E5FF44A5D462F1", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("914F74AC9A716BF09BF6C2FC39DDA82F192658499EF5A51C0337", 16));
		encryptedMessage.add(new BigInteger("5EC1F832B573ADC8AA225D6AD9B167A349CA5CCBEB5B53C6EA96", 16));
		encryptedMessage.add(new BigInteger("5EC1F832B573ADC8AA225D6AD9B167A349CA5CCBEB5B53C6EA96", 16));
		encryptedMessage.add(new BigInteger("D99759878C1BAA63B386514503668426726E20D422DD97E9E14C", 16));
		encryptedMessage.add(new BigInteger("014002A30BB31D9FDB598B06CD0CF44FDC77F6792C6DE7157D0371", 16));
		encryptedMessage.add(new BigInteger("0143787E5A2F8A92BBFAF4FEC064AFCFB04F1E3B50BBBF6B6ECC74", 16));
		encryptedMessage.add(new BigInteger("013DD7E41C5B0746001C38BCBEEC0EAC3BAA5047E39FE03CFD9357", 16));
		encryptedMessage.add(new BigInteger("021DDD79AFB2136B494FD91EF83F519D41195BF9430E75764C7162", 16));
		
		encryptedMessage.add(new BigInteger("024E4E423A3DC91596B1648C25DC7FA7C0BEB289B4C9D41C1031FB", 16));
		encryptedMessage.add(new BigInteger("01F9C6F30ABAF6C8550762490409BB6DDBC60B91831493D8ADEC2B", 16));
		encryptedMessage.add(new BigInteger("0111C5703F459CB5478416F8D7DC33E826E6980FBEF25717B0330A", 16));
		encryptedMessage.add(new BigInteger("8A8E9CBA22C14AF5C8141C323F990AB367DEF2E5FF44A5D462F1", 16));
		encryptedMessage.add(new BigInteger("0143787E5A2F8A92BBFAF4FEC064AFCFB04F1E3B50BBBF6B6ECC74", 16));
		encryptedMessage.add(new BigInteger("0111C5703F459CB5478416F8D7DC33E826E6980FBEF25717B0330A", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("01C0BE6DF40665DCBDBBDB41C8593DB0D8EB0BD2AC5AE85B511B36", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("01F79C341B62E06E79CA0FFEF5E8D5CA3AF865603A468D002E7C11", 16));
		encryptedMessage.add(new BigInteger("8A8E9CBA22C14AF5C8141C323F990AB367DEF2E5FF44A5D462F1", 16));
		
		encryptedMessage.add(new BigInteger("8A8E9CBA22C14AF5C8141C323F990AB367DEF2E5FF44A5D462F1", 16));
		encryptedMessage.add(new BigInteger("010B4A67A2760987D82A64572D8BE26BAFDAF44C65EC45EBA87AB6", 16));
		encryptedMessage.add(new BigInteger("0111C5703F459CB5478416F8D7DC33E826E6980FBEF25717B0330A", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("01370A3F98DEB4727B6EBD853EF154FF27EA02AFB245D5B313377C", 16));
		encryptedMessage.add(new BigInteger("01C5E9260078F291055331F90D6059E2B18FDF34A87D24AC6FE2A7", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("01F79C341B62E06E79CA0FFEF5E8D5CA3AF865603A468D002E7C11", 16));
		encryptedMessage.add(new BigInteger("027B5D2C52094EE5EAE4A8E3A82DB527DA9FF6BAEEEBC71C188327", 16));
		encryptedMessage.add(new BigInteger("027B5D2C52094EE5EAE4A8E3A82DB527DA9FF6BAEEEBC71C188327", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("01C7397690D5F90A2D158DE372A98F2D4FF6AF960560F98758D38A", 16));
		encryptedMessage.add(new BigInteger("014002A30BB31D9FDB598B06CD0CF44FDC77F6792C6DE7157D0371", 16));
		encryptedMessage.add(new BigInteger("018F0B5FD91C77FF4944FD3BDFD0C1C94F8285A71A9180079281CC", 16));
		encryptedMessage.add(new BigInteger("01C198DC530175BD7136D1A17130EE09DB51E1A298451A58E79A6D", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("014002A30BB31D9FDB598B06CD0CF44FDC77F6792C6DE7157D0371", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("0143787E5A2F8A92BBFAF4FEC064AFCFB04F1E3B50BBBF6B6ECC74", 16));
		encryptedMessage.add(new BigInteger("014002A30BB31D9FDB598B06CD0CF44FDC77F6792C6DE7157D0371", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("013DD7E41C5B0746001C38BCBEEC0EAC3BAA5047E39FE03CFD9357", 16));
		encryptedMessage.add(new BigInteger("0143787E5A2F8A92BBFAF4FEC064AFCFB04F1E3B50BBBF6B6ECC74", 16));
		encryptedMessage.add(new BigInteger("8A8E9CBA22C14AF5C8141C323F990AB367DEF2E5FF44A5D462F1", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("0111C5703F459CB5478416F8D7DC33E826E6980FBEF25717B0330A", 16));
		encryptedMessage.add(new BigInteger("8A8E9CBA22C14AF5C8141C323F990AB367DEF2E5FF44A5D462F1", 16));
		encryptedMessage.add(new BigInteger("8A8E9CBA22C14AF5C8141C323F990AB367DEF2E5FF44A5D462F1", 16));
		encryptedMessage.add(new BigInteger("010B4A67A2760987D82A64572D8BE26BAFDAF44C65EC45EBA87AB6", 16));
		encryptedMessage.add(new BigInteger("0111C5703F459CB5478416F8D7DC33E826E6980FBEF25717B0330A", 16));
		encryptedMessage.add(new BigInteger("014002A30BB31D9FDB598B06CD0CF44FDC77F6792C6DE7157D0371", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		
		encryptedMessage.add(new BigInteger("0143787E5A2F8A92BBFAF4FEC064AFCFB04F1E3B50BBBF6B6ECC74", 16));
		encryptedMessage.add(new BigInteger("01CED4BCE248B90BDB6466E9E57B8423CE0ECCCB54EADC8436F307", 16));
		encryptedMessage.add(new BigInteger("01C5E9260078F291055331F90D6059E2B18FDF34A87D24AC6FE2A7", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("0143787E5A2F8A92BBFAF4FEC064AFCFB04F1E3B50BBBF6B6ECC74", 16));
		encryptedMessage.add(new BigInteger("8A8E9CBA22C14AF5C8141C323F990AB367DEF2E5FF44A5D462F1", 16));
		encryptedMessage.add(new BigInteger("01C7397690D5F90A2D158DE372A98F2D4FF6AF960560F98758D38A", 16));
		encryptedMessage.add(new BigInteger("01C7397690D5F90A2D158DE372A98F2D4FF6AF960560F98758D38A", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("01C198DC530175BD7136D1A17130EE09DB51E1A298451A58E79A6D", 16));
		encryptedMessage.add(new BigInteger("8A8E9CBA22C14AF5C8141C323F990AB367DEF2E5FF44A5D462F1", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("01F79C341B62E06E79CA0FFEF5E8D5CA3AF865603A468D002E7C11", 16));
		encryptedMessage.add(new BigInteger("027B5D2C52094EE5EAE4A8E3A82DB527DA9FF6BAEEEBC71C188327", 16));
		encryptedMessage.add(new BigInteger("010B4A67A2760987D82A64572D8BE26BAFDAF44C65EC45EBA87AB6", 16));
		encryptedMessage.add(new BigInteger("0111C5703F459CB5478416F8D7DC33E826E6980FBEF25717B0330A", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("027B5D2C52094EE5EAE4A8E3A82DB527DA9FF6BAEEEBC71C188327", 16));
		encryptedMessage.add(new BigInteger("89B42E5B27B16A424D1DBC8967E8B1B1010922FA1512A83DE3BA", 16));
		encryptedMessage.add(new BigInteger("01C5E9260078F291055331F90D6059E2B18FDF34A87D24AC6FE2A7", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("013DD7E41C5B0746001C38BCBEEC0EAC3BAA5047E39FE03CFD9357", 16));
		encryptedMessage.add(new BigInteger("01C7397690D5F90A2D158DE372A98F2D4FF6AF960560F98758D38A", 16));
		encryptedMessage.add(new BigInteger("8A8E9CBA22C14AF5C8141C323F990AB367DEF2E5FF44A5D462F1", 16));
		encryptedMessage.add(new BigInteger("01C5E9260078F291055331F90D6059E2B18FDF34A87D24AC6FE2A7", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("0111C5703F459CB5478416F8D7DC33E826E6980FBEF25717B0330A", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("01C198DC530175BD7136D1A17130EE09DB51E1A298451A58E79A6D", 16));
		encryptedMessage.add(new BigInteger("014002A30BB31D9FDB598B06CD0CF44FDC77F6792C6DE7157D0371", 16));
		encryptedMessage.add(new BigInteger("01C198DC530175BD7136D1A17130EE09DB51E1A298451A58E79A6D", 16));
		encryptedMessage.add(new BigInteger("0111C5703F459CB5478416F8D7DC33E826E6980FBEF25717B0330A", 16));
		encryptedMessage.add(new BigInteger("8A8E9CBA22C14AF5C8141C323F990AB367DEF2E5FF44A5D462F1", 16));
		encryptedMessage.add(new BigInteger("0143787E5A2F8A92BBFAF4FEC064AFCFB04F1E3B50BBBF6B6ECC74", 16));
		encryptedMessage.add(new BigInteger("010D752691CE1FE1B367B6A13BACC80F50A89A7DAEBA4CC427EAD0", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("0143787E5A2F8A92BBFAF4FEC064AFCFB04F1E3B50BBBF6B6ECC74", 16));
		encryptedMessage.add(new BigInteger("01370A3F98DEB4727B6EBD853EF154FF27EA02AFB245D5B313377C", 16));
		encryptedMessage.add(new BigInteger("027B5D2C52094EE5EAE4A8E3A82DB527DA9FF6BAEEEBC71C188327", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("0143787E5A2F8A92BBFAF4FEC064AFCFB04F1E3B50BBBF6B6ECC74", 16));
		encryptedMessage.add(new BigInteger("010C24D6017119688BA55AB6D66392C4B241CA1C51D677E93EF9ED", 16));
		encryptedMessage.add(new BigInteger("014002A30BB31D9FDB598B06CD0CF44FDC77F6792C6DE7157D0371", 16));
		encryptedMessage.add(new BigInteger("018F0B5FD91C77FF4944FD3BDFD0C1C94F8285A71A9180079281CC", 16));
		encryptedMessage.add(new BigInteger("01935BA98693F4D2DD615D937C002DA225C083392AC98A5B1ACA06", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("010B4A67A2760987D82A64572D8BE26BAFDAF44C65EC45EBA87AB6", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("01C198DC530175BD7136D1A17130EE09DB51E1A298451A58E79A6D", 16));
		encryptedMessage.add(new BigInteger("01C7397690D5F90A2D158DE372A98F2D4FF6AF960560F98758D38A", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("014002A30BB31D9FDB598B06CD0CF44FDC77F6792C6DE7157D0371", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("89B42E5B27B16A424D1DBC8967E8B1B1010922FA1512A83DE3BA", 16));
		encryptedMessage.add(new BigInteger("010B4A67A2760987D82A64572D8BE26BAFDAF44C65EC45EBA87AB6", 16));
		encryptedMessage.add(new BigInteger("027B5D2C52094EE5EAE4A8E3A82DB527DA9FF6BAEEEBC71C188327", 16));
		encryptedMessage.add(new BigInteger("D99759878C1BAA63B386514503668426726E20D422DD97E9E14C", 16));
		encryptedMessage.add(new BigInteger("01C7397690D5F90A2D158DE372A98F2D4FF6AF960560F98758D38A", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("01F9C6F30ABAF6C8550762490409BB6DDBC60B91831493D8ADEC2B", 16));
		encryptedMessage.add(new BigInteger("89B42E5B27B16A424D1DBC8967E8B1B1010922FA1512A83DE3BA", 16));
		encryptedMessage.add(new BigInteger("018F0B5FD91C77FF4944FD3BDFD0C1C94F8285A71A9180079281CC", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("01C198DC530175BD7136D1A17130EE09DB51E1A298451A58E79A6D", 16));
		encryptedMessage.add(new BigInteger("8A8E9CBA22C14AF5C8141C323F990AB367DEF2E5FF44A5D462F1", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("027B5D2C52094EE5EAE4A8E3A82DB527DA9FF6BAEEEBC71C188327", 16));
		encryptedMessage.add(new BigInteger("89B42E5B27B16A424D1DBC8967E8B1B1010922FA1512A83DE3BA", 16));
		encryptedMessage.add(new BigInteger("01C7397690D5F90A2D158DE372A98F2D4FF6AF960560F98758D38A", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("01C50EB7A17DE2B051D83B996488A989AF290964BC92F2AED96370", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("010B4A67A2760987D82A64572D8BE26BAFDAF44C65EC45EBA87AB6", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("021DDD79AFB2136B494FD91EF83F519D41195BF9430E75764C7162", 16));
		encryptedMessage.add(new BigInteger("0112F3B8F3E797CF872646AF4ABBBECFC296B247F24BF41574B245", 16));
		encryptedMessage.add(new BigInteger("01C198DC530175BD7136D1A17130EE09DB51E1A298451A58E79A6D", 16));
		encryptedMessage.add(new BigInteger("D99759878C1BAA63B386514503668426726E20D422DD97E9E14C", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("D99759878C1BAA63B386514503668426726E20D422DD97E9E14C", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("0248CFAFD8245127C2F2D47E16CD88E74ED09ABF71382CCAC36A86", 16));
		encryptedMessage.add(new BigInteger("014002A30BB31D9FDB598B06CD0CF44FDC77F6792C6DE7157D0371", 16));
		encryptedMessage.add(new BigInteger("014452ECB92A9A736F75EB5E693C6028B2B5F40B3CA5F169054BAB", 16));
		encryptedMessage.add(new BigInteger("017605FAD4148850E3ECC96451C4DC103C1E7A36CE6F59BCC3E515", 16));
		encryptedMessage.add(new BigInteger("01F79C341B62E06E79CA0FFEF5E8D5CA3AF865603A468D002E7C11", 16));
		encryptedMessage.add(new BigInteger("0111C5703F459CB5478416F8D7DC33E826E6980FBEF25717B0330A", 16));
		encryptedMessage.add(new BigInteger("021DDD79AFB2136B494FD91EF83F519D41195BF9430E75764C7162", 16));
		encryptedMessage.add(new BigInteger("021DDD79AFB2136B494FD91EF83F519D41195BF9430E75764C7162", 16));
		encryptedMessage.add(new BigInteger("021DDD79AFB2136B494FD91EF83F519D41195BF9430E75764C7162", 16));
		encryptedMessage.add(new BigInteger("01370A3F98DEB4727B6EBD853EF154FF27EA02AFB245D5B313377C", 16));
		return encryptedMessage;
	}
}
